package main

import (
	"flag"
	"github.com/fatih/color"
	"github.com/ifnk/micro-blog/internal/comment"
	"github.com/ifnk/micro-blog/internal/pkg/config"
	"github.com/ifnk/micro-blog/internal/pkg/dbcontext"
	"github.com/ifnk/micro-blog/internal/pkg/log"
	"github.com/ifnk/micro-blog/protobuf/comment_pb"
	"github.com/pkg/errors"
	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
	"net"
)

// 命令行可以 传 config.yaml 的路径 , 默认 的值的是  ./configs/config.yaml
var flagConfig = flag.String("config", "./configs/config.yaml", "path to config file")

func main() {
	flag.Parse()

	logger := log.New()
	// 加载 配置文件 config.yaml 获取 config 实体
	conf, err := config.Load(*flagConfig)
	color.Blue("conf.Comment 读取为 -> %+v", conf.Comment)
	if err != nil {
		logger.Fatal(err)
	}
	logger.Infof("加载的配置文件为 conf.Comment -> %+v", conf.Comment)

	// 初始化数据库
	gormDB, jinZhuDB := InitDB(logger, conf)

	//_, jinzhuDB, err := dbcontext.NewPermissionDB(conf)

	if err != nil {
		logger.Fatal(err)
	}

	grpcServer := grpc.NewServer()

	// user repo 的接口 注册 为grpc服务
	comment_pb.RegisterCommentServiceServer(grpcServer, InitCommentServer(logger, gormDB, jinZhuDB))
	// 这个角色 服务 只 实现了 基本 的crud ,所以就用他默认 的 AuthorityServiceDefaultServer 注册 ，如果要
	// 写自定义的 业务的话，就 在他外面包一层， 参看 上面 两行的 user 和  UserRltAuth  server 的写法
	// todo 这里 除了注册 userService 意外 ，还注册  RegisterUserServiceServer 和 UserRltAuthServiceServer
	// 注册 grpc 反射服务   Server 端添加后可以通过该服务获取所有服务的信息，包括服务定义，方法，属性等
	reflection.Register(grpcServer)

	// 监听 user 服务 grpc 端口 50052
	lis, err := net.Listen("tcp", conf.Comment.Server.GRPC.Port)
	logger.Infof("监听 comment 服务 grpc 端口 嘟嘟    %s", conf.Comment.Server.GRPC.Port)
	if err != nil {
		logger.Errorf(" 监听 comment 服务 grpc 端口 %+v  失败  failed to listen: %+v", conf.Comment.Server.GRPC.Port, err)
	}

	if err = grpcServer.Serve(lis); err != nil {
		logger.Errorf("comment 服务 grpc 启动失败!  failed to serve: %v", err)
	}

}

func InitCommentServer(logger *log.Logger, gormDB *dbcontext.GormDB, jinzhuDB *dbcontext.JinZhuDB) *comment.CommentServer {
	server := comment.NewCommentServer(logger, gormDB, jinzhuDB)
	return &server
}
func InitDB(logger *log.Logger, conf *config.Config) (*dbcontext.GormDB, *dbcontext.JinZhuDB) {
	gormDB, jinzhuDB, err := dbcontext.NewCommentDB(conf)
	if err != nil {
		logger.Fatal("数据库  comment   连接失败! err -> %+v", err)
	}
	// 自动 迁移 表
	err = gormDB.AutoMigrate(
		&comment_pb.CommentORM{},
	)
	if err != nil {
		logger.Fatal("数据表  全部  迁移失败! err -> %+v", err)
	}

	// 初始化 comment  数据
	InitCommentData(gormDB, logger)
	return gormDB, jinzhuDB
}
func InitCommentData(db *dbcontext.GormDB, logger *log.Logger) {
	var count int64
	db.Model(&comment_pb.CommentORM{}).Count(&count)
	if count == 0 {
		//  表为空的话 创建种子数据
		logger.Infof("comment 表数据为空,将创建种子数据")
		entities := []comment_pb.CommentORM{
			{Id: 1, Content: "嘟嘟评论", PostId: 1, UserId: 1},
		}
		err := db.Create(&entities).Error
		if err != nil {
			err = errors.Wrap(err, "users  表数据初始化失败!")
			logger.Fatal(err)
		}
	}
}
